package cn.gok.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @Author: chenfan
 * @Description:
 */
public class CglibProxyLog implements MethodInterceptor {

    /**
     * 委托类的对象
     */
    private Object obj;
    public CglibProxyLog(Object obj){
        this.obj = obj;
    }


    /**
     * 在当前方法中书写功能增强的逻辑
     *      并且在此方法中需要调用父类（委托类）中的原始方法
     *
     * @param proxy         代理对象
     * @param method
     * @param args          方法的参数
     * @param methodProxy   父类的方法（委托类的方法）
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("功能增强，记录日志。。。");

        /*
         * 调用父类中的方法
         *      proxy 动态代理对象 也就是子类对象
         *      args： 方法参数
         */
        Object result = methodProxy.invokeSuper(proxy, args);

        return result;
    }


    /**
     * 当前方法用来产生cglib的动态代理对象
     * @return
     */
    public Object getCglibProxyObject(){
        Enhancer enhancer = new Enhancer();

        //设置委托类作为父类
        enhancer.setSuperclass(obj.getClass());

        //设置增强逻辑接口实现，即MethodInterceptor 实现类的对象
        enhancer.setCallback(this);

        //创建动态代理对象并返回
        return enhancer.create();
    }
}
